Note 5 Linux 进程
什么是进程?
An executing program = A process
当你执行一个外部命令(内部命令是shell进程的一部分,不需要创建进程)时,Linux系统会为之创建一个进程,命令完成之后会撤销它
进程的创建和终止是linux系统处理外部命令所采用的唯一机制
Linux通过系统调用fork创建一个新的进程,该操作建立原进程内存的完全拷贝,然后系统调用exec来使要执行命令的代码覆盖新进程。
(ps 命令可以用来查看进程的属性和状态,具体请自行查阅)
进程执行和作业控制
前台执行:当输入命令并开始执行,在当前命令结束前,你不能执行任何命令
后台执行:在执行命令的同时,你可以看到哦啊shell提示符出现,并执行其他命令
在命令最后添加一个 ‘&’符号,可以使命令后台执行,此时会输出这样一行信息“[1] 23245” 中括号里的数字为作业号(job number),后面的数字为进程号(PID)
作业是不运行在前台的进程,只能在关联终端上访问
(fg命令可以将后台进程转移到前台,用法:fg %jobid,使作业号为jobid的前台进程继续执行,或者转移到前台)
(Ctrl-C可以中止一个前台命令)
(Ctrl-Z可以挂起一个前台进程)
(bg命令可以把挂起的进程转移到后台继续执行, bg %jobidlist)
(jobs命令显示指定的被挂起进程或后台进程的状态)
(at命令使指定命令序列在指定时刻执行)
(batch命令指定作业在系统负载较轻时运行)
(kill命令可以中止后台进程)
(sleep n 命令可以使正在执行的进程睡眠n秒)
有一种特殊的进程,守护进程(daemon)是运行于后台的系统进程,向用户提供各种类型的服务和执行系统管理任务,例如smtpd、httpd、inetd
在一个命令行输入多条命令,并在每条命令末尾加上分号,可以顺序执行这些命令,若以‘&’连接多条命令则并行执行它们,例如
顺序执行:命令1; 命令2; 命令3;
并行执行:命令1& 命令2& 命令3&
使用&&和||可以有条件的执行命令,例如:
命令1 && 命令2 代表如果命令1成功则执行命令2
命令1 || 命令2 代表如果命令1失败则执行命令2
Note 6 重定向和管道
重定向
在默认状态下,命令的stdin 为 keyboard; stdout和stderr为屏幕
我们可以使用重定向运算符,将命令的输入和输出重定向到文件
输入重定向,‘<’
语法:command < inputfile
命令的输入来自inputfile而不是键盘
输出重定向,‘>’
语法:command > outputfile
命令的输出写到文件outputfile,而不是显示器
两者可以同时使用,比如
command < inputfile > outputfile
command > outputfile < inputfile
另外,linux内核将一些小的整数关联到每个已打开的文件上,称为文件描述符
stdin--0 stdout--1 stderr--2
所以我们可以这样用:
command 0< inputfile 等价于 command < inputfile
command 2> errorfile 1>outputfile
command 1> file 2> &1
(重定向的顺序是从左到右)
(2> &1含义是将错误信息输出到和1相同的文件)
默认情况下,输出和错误重定向会覆盖目标文件的内容
如果需要追加而不是覆盖,则使用>>运算符,而不是>运算符
注意,exec命令有些特殊,exec <input 将input文件中每一行作为命令由shell执行; exec >output 将shell之后所有命令输出到output文件里
管道
Linux允许一条命令的输出作为另一条命令的输入
语法: 命令1 | 命令2 | 命令3 ...
命令1的输出作为命令2的输入,之后同理
例子:
ls -l | grep ”somedata“
grep “data” < inputfile | lpr -Pspr
who | sort | grep "name" | mail -S "content" xxx@xx.com
(第三条命令将who的输出排序,找到其中包含name的行,并和content一起发送给xxx@xx.com)
当你想要把命令的输出既输出到文件,又通过管道传递,那么你需要tee命令
语法: tee [options] filelist
作用: 将输出送到标准输出和filelist中
用法: command1 | tee file1 file2 | command2
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。